home *** CD-ROM | disk | FTP | other *** search
- Path: abcfd20.larc.nasa.gov!amiga-request
- From: amiga-request@abcfd20.larc.nasa.gov (Amiga Sources/Binaries Moderator)
- Subject: v90i225: BlitterSand - cellular automaton model of self organized criticality, Part01/01
- Reply-To: michael creutz <creutz@max.bnl.gov>
- Newsgroups: comp.sources.amiga
- Message-ID: <comp.sources.amiga:v90i225@abcfd20.larc.nasa.gov>
- Date: 15 Aug 90 01:04:37 GMT
- Approved: tadguy@uunet.UU.NET (Tad Guy)
- X-Mail-Submissions-To: amiga@uunet.uu.net
- X-Post-Discussions-To: comp.sys.amiga
-
- Submitted-by: michael creutz <creutz@max.bnl.gov>
- Posting-number: Volume 90, Issue 225
- Archive-name: examples/blittersand/part01
-
- [ uuencoded executable and icons enclosed ...tad ]
-
- This program simulates the cellular automaton model presented
- by P. Bak, C. Tang, and K. Wiesenfeld (Phys. Rev. Lett. 59, 381 (1987);
- Phys. Rev. A38, 364 (1988)) to illustrate self organized criticality.
- Each site carries a positive integer representing the local slope of
- a sandpile. If the slope exceeds 3, the site is unstable and on
- updating it drops by 4, adding one to each of his neighbors.
- Sand is lost only at the edges. Any state will relax to stability
- through such sand loss.
-
- #!/bin/sh
- # This is a shell archive. Remove anything before this line, then unpack
- # it by saving it into a file and typing "sh file". To overwrite existing
- # files, type "sh file -c". You can also feed this as standard input via
- # unshar, or by typing "sh <file", e.g.. If this archive is complete, you
- # will see the following message at the end:
- # "End of archive 1 (of 1)."
- # Contents: BlitterSan0.uu BlitterSan1.uu BlitterSand.asm
- # BlitterSand.uu
- # Wrapped by tadguy@abcfd20 on Tue Aug 14 21:04:35 1990
- PATH=/bin:/usr/bin:/usr/ucb ; export PATH
- if test -f 'BlitterSan0.uu' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'BlitterSan0.uu'\"
- else
- echo shar: Extracting \"'BlitterSan0.uu'\" \(3658 characters\)
- sed "s/^X//" >'BlitterSan0.uu' <<'END_OF_FILE'
- Xbegin 700 BlitterSand.asm.info
- XMXQ```0``````8P`+`&(`'0`&``,``0`C,C``(SB0````````````````````;
- XM````!"(`(SKX`````````%\```````````````````````````!B`!T``P`!=
- XM.*C_`````````````````````````````````$5555550```````````15_5Q
- XM555```````````!%5M55544``````````$569]?51P``````````159G9V5'3
- XM``````````!%5F9F14<``````````$56QF9U1P``````````15_'Q\5'````T
- XM``````!%5!4%!4<``````````$5555551P``````````1?UU=55'````````G
- XM``!%S%%Q54<``````````$7$=7%]1P``````````1?5Q<<U'``````````!%7
- XMP7%Q_$<``````````$7%<7'`1P``````````1>5Y>7U'``````````!%!4%!%
- XM04<``````````$5555551P``````````1555555'``````````!%555554<`H
- XM`````````$5555551P``````````15550`%'``````````!%555554<`````W
- XM````````````!P``````````+_______```````````55555554`````````O
- XM```````````````````!_______X``````````'_______@``````````?_P8
- XM?____\`````````!__D_____P`````````'_^9P\/_O``````````?_YF9F?&
- XM^\`````````!__F9F?_[P`````````'_^3F9G_O``````````?_P?#P_^\``G
- XM```````!_______[P`````````'_______O``````````?X#SX__^\``````(
- XM```!_S/_S__[P`````````'_/X_/A_O``````````?\/S\\S^\`````````!V
- XM_S_/SP/[P`````````'_/\_//_O``````````?X?AX>'^\`````````!____=
- XM___[P`````````'_______O``````````?______^\`````````!_______[>
- XMP`````````'_______O``````````?______^\`````````!_______[P```E
- XM``````'_______O``````````?@``````\``````````________P```````M
- XM``!________`````````````````````````````````````````````````Z
- XM`````````````````````````````````````````````````````````````
- XM`````````````````````````````````````````````````````````````
- XM`````````````````````````````````````````````````````````````
- XM`````````````````````````````````````````````````````````````
- XM`````````````````````````````````````````````````````````````
- XM`````````````````````````````````````````````````````````````
- XM`````````````````````````````````````````````````````````````
- XM`````````````````````````````````````````````````````````````
- XM`````````````````````&(`'0`#``(2</\`````````````````````````%
- XM*JJJJJJH!5555555```W______Z_______L``#?______K______^P``-___K
- XM___^O______[```WZJJJJN`#ZJJJJKL``#?______K______^P``-______^O
- XMOZJJJJJ[```W______Z_______L``#?55555?K^JJJJJNP``-______^O___B
- XM___[```W555557Z_JJJJJKL``#?______K______^P``-U55555^OZJJJJJ[V
- XM```W_____^`#______L``#=55555?K^JJJJJNP``-______^O______[```W6
- XMU55557Z_JJJJJKL``#?______K______^P``-U55555^OZJJJJJ[```W____Z
- XM__Z_______L``#=55555?K^JJJJJNP``-______^O______[```W_____^`#;
- XM______L``#?__U___K___K__^P``-______^O______[```P``````"`````4
- XM``,``"JJJJJJJ`55555550````````````````````#_______X?_______`^
- XM`/_______________\``^``````!P``````'P`#X``````'```````?``/@`L
- XM`````<``````!\``^``````?_!55555'P`#X``````'```````?``/@`````N
- XM`<!555551\``^``````!P``````'P`#X*JJJJH'`555554?``/@``````<``1
- XM````!\``^*JJJJJ!P%55555'P`#X``````'```````?``/BJJJJJ@<!55555X
- XM1\``^``````?_``````'P`#XJJJJJH'`555554?``/@``````<``````!\``=
- XM^"JJJJJ!P%55555'P`#X``````'```````?``/BJJJJJ@<!555551\``^```P
- XM```!P``````'P`#XJJJJJH'`555554?``/@``````<``````!\``^``````?;
- XM_``````'P`#X``"@``'```%```?``/@``````<``````!\``____________;
- XM____P`#________________``/_______A_______\``````````````````$
- XM`````````````````````````````````````````````````````````````
- XM`````````````````````````````````````````````````````````````
- XM`````````````````````````````````````````````````````````````
- XM`````````````````````````````````````````````````````````````
- XM`````````````````````````````````````````````````````````````
- XM`````````````````````````````````````````````````````````````
- XM`````````````````````````````````````````````````````````````
- XM`````````````````````````````````````````````````````````````
- XM`````````````````````````````````````````````````!-S>7,Z=71I^
- X,;&ET:65S+VUO<F4`L
- X``
- Xend
- Xsize 2577
- END_OF_FILE
- if test 3658 -ne `wc -c <'BlitterSan0.uu'`; then
- echo shar: \"'BlitterSan0.uu'\" unpacked with wrong size!
- fi
- # end of 'BlitterSan0.uu'
- fi
- if test -f 'BlitterSan1.uu' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'BlitterSan1.uu'\"
- else
- echo shar: Extracting \"'BlitterSan1.uu'\" \(1204 characters\)
- sed "s/^X//" >'BlitterSan1.uu' <<'END_OF_FILE'
- Xbegin 700 BlitterSand.info
- XMXQ```0``````%``+`#\`%@`&``$``0`C(\@`(R<P``'SG@```````````&0`N
- XM`````R(``````"`'F````!```````````````````!`````````_`!8``@``;
- XM_K@#````````````````````````````````````(`````````!_````````8
- XM``'X```````````````````````J@````````$!`````````@"````,```$`'
- XM```*!````````!4(`````%`HJI````"JH%%58````%5:HJJJ@```*K5%554`@
- XM```52@JJJJ@```J4555550`"JJB*JJBJH!5544555%50*JJJHJJJ*JA55555Y
- XM55555`````````````````````````````'@`````````_\````````'`?@`V
- XM``````8`.```````!P!P`!4````#`<``H(````'_``$`0````P`````@``H$@
- XM```!`?``%0@```'_H"BND````%505=_@````*JJJO_^```!5555__P```"JJ;
- XMJO_^J```%555?_U5``*JJJK_^JJ@%55555_555`JJJJJJJJJJ%5555555554$
- XM```````_`!8``@`!`!@#``````````````````````````````JJH```````'
- XM555`````<`"JJH````!P`5557__\`'`"JJJ@````<`%554````!P`*JJH```(
- XM````U55```````&`0``*`````!```!4``````%`HJH````"JH%%50````E5:=
- XMHJJB@``$*K5%55$```(5:@JJJJ@``$J4555150`"JJB*JJBJH!5544555%50Y
- XM*JJJHJJJ*JA5555555555```````````````````````'__@``'_\`#__^``Y
- XM`X!P`?O_P``'`'`#U_____X`<`.J_^``!X!P`]7_X``'P'``JO_@``'_\`!5I
- XM_^```````(````H````!$_``%0````'_H"BJ@````550555````"JJJJJJJ`8
- XM``15555570```BJJJJJNJ```55555555``*JJJJJKJJ@%555555555`JJJJJ@
- X0JJJJJ%5555555554````!```1
- X``
- Xend
- Xsize 826
- END_OF_FILE
- if test 1204 -ne `wc -c <'BlitterSan1.uu'`; then
- echo shar: \"'BlitterSan1.uu'\" unpacked with wrong size!
- fi
- # end of 'BlitterSan1.uu'
- fi
- if test -f 'BlitterSand.asm' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'BlitterSand.asm'\"
- else
- echo shar: Extracting \"'BlitterSand.asm'\" \(29043 characters\)
- sed "s/^X//" >'BlitterSand.asm' <<'END_OF_FILE'
- X;BlitterSand
- X;by Mike Creutz
- X; P.O. Box 204
- X; E. Moriches, NY 11940
- X; USA
- X;creutz@bnlux0.bnl.gov
- X;23 June 1990
- X
- X;This program simulates the cellular automaton model presented
- X;by P. Bak, C. Tang, and K. Wiesenfeld (Phys. Rev. Lett. 59, 381 (1987);
- X;Phys. Rev. A38, 364 (1988)) to illustrate self organized criticality.
- X;Each site carries a positive integer representing the local slope of
- X;a sandpile. If the slope exceeds 3, the site is unstable and on
- X;updating it drops by 4, adding one to each of his neighbors.
- X;Sand is lost only at the edges. Any state will relax to stability
- X;through such sand loss.
- X
- X;The colors representing slopes of 0 through 7 are white, black,
- X;red, green, yellow, blue, magenta, and cyan, respectively.
- X
- X;Various keypresses do as follows:
- X; <esc>, q, or any control character exits
- X; p pauses; repeated presses single step; any other key restarts
- X; d doubles the lattice modulo 8
- X; a sets a flag to pause after each relaxation
- X
- X;The program can be run from either CLI or Workbench. This code
- X;is completely self contained and will run directly through A68K
- X;followed by BLink without need for any include files.
- X
- X;The program directly accesses the blitter for speed, but does
- X;so in a mode friendly to multitasking. To understand the program
- X;details you should have the Amiga Hardware Reference Manual.
- X
- X;Technically, the show proceeds as follows:
- X
- X;We start with ones on the borders and twos on the corners
- X;of a 288 by 188 lattice. For the first loop, whenever a stable state
- X;occurs, the heights are all doubled, and the system is allowed to
- X;relax back to stability. This eventually leads to a unique state
- X;that when doubled relaxes to itself. The system can be described
- X;as a large Abelian group and this state represents the identity.
- X
- X;After the identity is found, the program proceeds to construct
- X;the inverse of the state with all cells unity. After this is found it
- X;is tripled to give the inverse of the minimally stable state with all
- X;cells being 3.
- X
- X;After all this, to keep the show going, the identity is
- X;added to the system which then relaxes back to itself. This loops
- X;until intervention.
- X
- X;If you hit 'd' on an active state early in the program, the search for
- X;the identity will be derailed and the program will go into a mode where
- X;the pattern is unlikely to repeat for the lifetime of the universe.
- X;After a few hours, however, it will probably look uninterestingly random.
- X; ******************************************************
- X
- X; library offsets:
- X_LVOOpenLibrary EQU -552
- X_LVOCloseLibrary EQU -414
- X_LVOSetAPen EQU -342
- X_LVOSetBPen EQU -348
- X_LVOSetDrMd EQU -354
- X_LVOWritePixel EQU -324
- X_LVOMove EQU -240
- X_LVODraw EQU -246
- X_LVOText EQU -60
- X_LVOClipBlit EQU -552
- X_LVOOpenScreen EQU -198
- X_LVOOpenWindow EQU -204
- X_LVOCloseScreen EQU -66
- X_LVOCloseWindow EQU -72
- X_LVOGetMsg EQU -372
- X_LVOReplyMsg EQU -378
- X_LVOWaitPort EQU -384
- X_LVOLoadRGB4 EQU -192
- X_LVOOwnBlitter EQU -456
- X_LVODisownBlitter EQU -462
- X_LVOWaitBlit EQU -228
- X_LVOAllocMem EQU -198
- X_LVOFreeMem EQU -210
- X_LVOSetRast EQU -234
- X_LVOFindTask EQU -294
- X_LVOForbid EQU -132
- X
- X;IDCMP Flags
- XCLOSEWINDOW EQU $200
- XVANILLAKEY EQU $200000
- X; window flags
- XWINDOWDRAG EQU $2
- XWINDOWDEPTH EQU $4
- XWINDOWCLOSE EQU $8
- XBACKDROP EQU $100
- XBORDERLESS EQU $800
- XACTIVATE EQU $1000
- X; various useful numbers
- XMEMF_PUBLIC EQU 1
- XMEMF_CHIP EQU 2
- XMEMF_FAST EQU 4
- XMEMB_CLEAR EQU $10000
- Xpr_CLI EQU 172
- Xpr_MsgPort EQU 92
- XAbsExecBase EQU $4
- XJAM1 EQU 0
- XJAM2 EQU 1
- XCOMPLEMENT EQU 2
- XINVERSID EQU 3
- X
- X; custom chip register offsets
- X_custom EQU $DFF000
- XDMACONR EQU $002
- XBLTCON0 EQU $040
- XBLTCON1 EQU $042
- XBLTAFWM EQU $044
- XBLTALWM EQU $046
- XBLTCPT EQU $048
- XBLTBPT EQU $04C
- XBLTAPT EQU $050
- XBLTDPT EQU $054
- XBLTSIZE EQU $058
- XBLTCMOD EQU $060
- XBLTBMOD EQU $062
- XBLTAMOD EQU $064
- XBLTDMOD EQU $066
- XBLTCDAT EQU $070
- XBLTBDAT EQU $072
- XBLTADAT EQU $074
- X
- X; various size parameters
- Xxmin EQU 16 ; should be a multiple of 16
- Xymin EQU 11 ; 11 or more to avoid border effects
- Xxmax EQU 303 ; -1+multiple of 16
- Xymax EQU 198
- X
- X; a small system for testing:
- X;xmin equ 48
- X;xmax equ 127
- X;ymin equ 50
- X;ymax equ 150
- X
- Xstartdisp EQU 2*(xmin/16)+ymin*40 ; shift from start of bitplane to lattice
- Xmodulo EQU 40-2*((xmax-xmin+1)/16) ; blitter modulo
- Xenddisp EQU -modulo-2+((ymax-ymin+1)*40) ; shift to end of lattice
- Xbsize EQU 20-(modulo/2)+$40*(ymax-ymin+1) ; for BLTSIZE
- Xworkspacesize EQU 40*(ymax-ymin+1)
- X
- X ; startup code for CLI or Workbench
- X ; opens graphics and intuition libraries, calls 'Main' and exits
- Xstartup:
- X movem.l d2-d7/a2-a6,-(a7) ; save registers
- X move.l AbsExecBase,a6 ; exec base pointer
- X clr.l workbenchmessage
- X suba.l a1,a1 ; clear a1
- X jsr _LVOFindTask(a6) ; where is our task
- X move.l d0,a4
- X tst.l pr_CLI(a4) ; are we running from CLI?
- X bne fromcli ; if not then get workbench message
- X lea pr_MsgPort(a4),a0
- X jsr _LVOWaitPort(a6)
- X Jsr _LVOGetMsg(a6)
- X move.l d0,workbenchmessage ; save for exit
- X;open graphics and intuition libraries
- Xfromcli lea GraphicsName(pc),a1 ; pointer to name of library
- X moveq #0,d0 ; accept any version
- X jsr _LVOOpenLibrary(a6)
- X move.l d0,GraphicsBase ; save graphics base
- X tst.l d0
- X beq.s Exit1 ; quit if trouble opening library
- X lea IntuitionName(pc),a1 ; pointer to name of library
- X moveq #0,d0 ; accept any version
- X jsr _LVOOpenLibrary(a6)
- X move.l d0,IntuitionBase ; save intuition base
- X tst.l d0
- X beq.s Exit2 ; quit if trouble opening library
- X
- X; execute main program
- X bsr Main
- X
- X;final cleanup
- XExit3: movea.l IntuitionBase,a1 ; intuition base
- X movea.l AbsExecBase,a6 ; exec base pointer
- X jsr _LVOCloseLibrary(a6)
- XExit2: movea.l GraphicsBase,a1 ; graphics base
- X jsr _LVOCloseLibrary(a6)
- X moveq.l #0,d0 ; return zero
- XExit1: tst.l workbenchmessage ; are we a workbench program?
- X beq.s Exit0 ; if not goto exit0
- X jsr _LVOForbid(a6) ; because the RKM tells me so
- X movea.l workbenchmessage(pc),a1
- X jsr _LVOReplyMsg(a6) ; reply to workbench message
- XExit0: movem.l (a7)+,d2-d7/a2-a6 ; restore registers
- X rts ; end of startup code
- X
- XMain: move.l a7,oldstack ; save stack for exit
- X; allocate various working areas
- X moveq.l #7,d2 ; memory allocation loop counter
- X lea.l workingplane1(pc),a2
- X bra.s startalloc
- Xallocloop move.l #workspacesize,d0 ; size for working area
- X move.l #MEMF_CHIP+MEMB_CLEAR,d1 ;get chip memory
- X jsr _LVOAllocMem(a6)
- X tst.l d0
- X beq quit1
- X move.l d0,(a2)+
- Xstartalloc dbf.s d2,allocloop
- X
- X; open screen and window
- X move.l IntuitionBase(pc),a6
- X lea myscreen(pc),a0
- X jsr _LVOOpenScreen(a6) ; open custom screen
- X move.l d0,screen ; save screen structure pointer
- X beq quit1 ; quit if trouble
- X lea mywindow(pc),a0 ; open display window
- X jsr _LVOOpenWindow(a6)
- X move.l d0,window ; save address of window structure
- X beq quit2 ;quit if trouble
- X movea.l d0,a0
- X move.l 86(a0),userport
- X movea.l 50(a0),a0 ; rastport
- X move.l a0,rastport
- X move.l 4(a0),a0 ; bitmap structure
- X move.l 8(a0),bitplane1
- X move.l 12(a0),bitplane2
- X move.l 16(a0),bitplane3
- X addi.l #startdisp,bitplane1
- X addi.l #startdisp,bitplane2
- X addi.l #startdisp,bitplane3
- X;set colors
- X movea.l GraphicsBase(pc),a6 ; graphics library address in a6
- X movea.l screen(pc),a0
- X adda.l #44,a0 ; viewport
- X lea.l colors(pc),a1
- X moveq.l #8,d0
- X jsr _LVOLoadRGB4(a6)
- X; show credits
- X bsr credits
- X;draw initial box of ones
- X movea.l rastport(pc),a1
- X moveq.w #1,d0
- X jsr _LVOSetAPen(a6) ; set pen color
- X movea.l rastport(pc),a1
- X moveq.w #JAM1,d0
- X jsr _LVOSetDrMd(a6) ; set drawing mode
- X movea.l rastport(pc),a1
- X move.w #xmin,d0
- X move.w #ymin,d1
- X jsr _LVOMove(a6) ; go to top left corner
- X movea.l rastport(pc),a0
- X move.w #xmax,d0
- X move.w #ymin,d1
- X jsr _LVODraw(a6) ; draw top line
- X movea.l rastport(pc),a0
- X move.w #xmax,d0
- X move.w #ymax,d1
- X jsr _LVODraw(a6) ; right side
- X movea.l rastport(pc),a0
- X move.w #xmin,d0
- X move.w #ymax,d1
- X jsr _LVODraw(a6) ; bottom
- X movea.l rastport(pc),a0
- X move.w #xmin,d0
- X move.w #ymin,d1
- X jsr _LVODraw(a6) ; left
- X;set corners to two
- X movea.l rastport(pc),a1
- X moveq.w #2,d0
- X jsr _LVOSetAPen(a6) ; new color for corners
- X movea.l rastport(pc),a1
- X move.w #xmin,d0
- X move.w #ymin,d1
- X jsr _LVOWritePixel(a6) ; nw corner
- X movea.l rastport(pc),a1
- X move.w #xmax,d0
- X move.w #ymin,d1
- X jsr _LVOWritePixel(a6) ; ne corner
- X movea.l rastport(pc),a1
- X move.w #xmax,d0
- X move.w #ymax,d1
- X jsr _LVOWritePixel(a6) ; se corner
- X movea.l rastport(pc),a1
- X move.w #xmin,d0
- X move.w #ymax,d1
- X jsr _LVOWritePixel(a6) ; sw corner
- X
- X; showtime -- first double until identity found
- Xfirstloop: bsr relax
- X lea.l storage1(pc),a0 ; prepare to compare with storage
- X lea.l bitplane1(pc),a1
- X bsr compare2 ; see if lattices equal
- X btst.b #5,control(pc)
- X bne.s foundidentity
- X lea.l bitplane1(pc),a0
- X lea.l storage1(pc),a1
- X bsr copy2 ; copy bitplanes to storage
- X bsr double ; double things
- X bra.s firstloop
- X; save identity and set first storage plane to unity
- Xfoundidentity:
- X lea.l bitplane1(pc),a0
- X lea.l identity1(pc),a1
- X bsr copy2
- X lea.l storage1(pc),a0
- X bsr set1
- X; subtract first storage plane while adding identity
- X bra.s stillactive
- Xsecondloop: bsr sand
- X btst.b #5,control(pc) ; check if still active
- X beq.s stillactive
- X lea.l identity1(pc),a0
- X lea.l bitplane1(pc),a1
- X bsr addit
- Xstillactive: bsr subtract1
- X btst.b #5,control(pc) ; check if more to subtract
- X bne.s tripleit
- X bsr checkmessage
- X bra.s secondloop
- X; triple to find inverse of minimally stable state
- Xtripleit bsr relax
- X lea.l bitplane1(pc),a0
- X lea.l storage1(pc),a1
- X bsr copy2
- X bsr double
- X bsr relax
- X lea.l storage1(pc),a0
- X lea.l bitplane1(pc),a1
- X bsr addit
- X bsr relax
- X; to keep display moving, repeatedly add identity and relax
- Xfinalloop lea.l identity1(pc),a0
- X lea.l bitplane1(pc),a1
- X bsr addit
- X bsr relax
- X bra.s finalloop
- X
- X; time to quit
- Xgetout:
- X ; close windows and screen
- X movea.l window(pc),a0
- X move.l IntuitionBase(pc),a6
- X jsr _LVOCloseWindow(a6)
- Xquit2 movea.l screen(pc),a0
- X jsr _LVOCloseScreen(a6)
- X; deallocate memory
- Xquit1: movea.l AbsExecBase,a6
- X moveq.l #7,d2 ; memory deallocation loop counter
- X lea.l workingplane1(pc),a2
- X bra.s startdealloc
- Xdeallocloop move.l #workspacesize,d0 ; size for working area
- X movea.l (a2)+,a1
- X move.l a1,d1 ; to test if not zero
- X beq.s done
- X jsr _LVOFreeMem(a6) ; return memory
- Xstartdealloc dbf.s d2,deallocloop
- Xdone movea.l oldstack(pc),a7 ; reset stack pointer
- X rts ; all done
- X
- X; subroutine to update lattice until relaxed
- Xrelax: bsr sand
- X btst.b #5,control(pc) ; check if still active
- X bne.s relaxed
- X bsr checkmessage
- X bra.s relax
- Xrelaxed: tst.w autopause ; should we pause
- X beq.s autooff
- X bsr waitformessage
- Xautooff rts
- X
- X; message handling subroutine
- X; message location returned in d0, class in d2, code in d3
- X; with VANILLAKEY code is ascii of pressed key
- Xwaitformessage: ; pause for a signal
- X movea.l AbsExecBase,a6
- X movea.l userport(pc),a0
- X jsr _LVOWaitPort(a6) ; wait for a message
- Xcheckmessage: ; enter here to not wait if no message
- X movea.l AbsExecBase,a6
- X movea.l userport(pc),a0
- X jsr _LVOGetMsg(a6)
- X tst.l d0
- X bne.s messagefound
- X rts
- Xmessagefound:
- X movea.l d0,a1
- X move.l 20(a1),d2 ; save class in d2
- X move.w 24(a1),d3 ; and code in d3
- X jsr _LVOReplyMsg(a6) ; reply to message
- X; check for various keypresses
- X cmpi.w #27,d3 ; esc
- X ble getout ; leave for escape or control characters
- X cmpi.w #'q',d3
- X beq getout ; quit for q
- X cmpi.w #'p',d3 ; p ; pause for p
- X bne.s not_p
- X movea.l userport(pc),a0
- X jsr _LVOWaitPort(a6) ; wait for a message
- Xnot_p cmpi.w #'d',d3 ; d
- X bne.s not_d ; double for d
- X bsr double
- Xnot_d cmpi.w #'a',d3 ; a
- X bne.s not_a
- X not.w autopause ; flip autopausing flag
- Xnot_a rts ; continue
- X
- X; storage area
- X; window and screen parameters
- Xmywindow dc.w 0,0,320,200 ; xmin,ymin,xsize,ysize
- X dc.b 0,0 ; detail pen, block pen
- X ; (Intuition Direct Communication Message Port)
- X dc.l VANILLAKEY ; IDCMP Flags, ask for keypresses
- X dc.l ACTIVATE+BORDERLESS ;+BACKDROP ; flags (type in amigabasic)
- X dc.l 0 ; gadgets
- X dc.l 0 ; checkmark
- X dc.l title ; my title
- Xscreen dc.l 0 ;location of screen, fill later
- X dc.l 0 ;bitmap
- X dc.w 0,0,320,200 ;min-max window size
- X dc.w $f ; type: 1=wbenchscreen $F=customscreen
- Xmyscreen dc.w 0,0,320,200 ;size
- X dc.w 3 ;depth
- X dc.b 5,6 ;pens
- X dc.w $0 ;viewmodes- interlace=4, hires=$8000
- X ; sprites=$4000, ham=$800, extra_halfbrite=$80
- X dc.w $f ;type: customscreen
- X dc.l textattr ;font
- X dc.l title ;title
- X dc.l 0 ;gadgets
- X dc.l 0 ;custombitmap
- Xtextattr dc.l fontname
- X dc.w 8 ;fontsize
- X dc.b 0,0 ;style and flags
- Xcolors dc.w $fff ; color table
- X dc.w $000
- X dc.w $f00
- X dc.w $0f0
- X dc.w $ff0
- X dc.w $00f
- X dc.w $f0f
- X dc.w $0ff
- X
- Xworkbenchmessage dc.l 0
- XGraphicsBase dc.l 0
- XIntuitionBase dc.l 0
- XGraphicsName dc.b 'graphics.library',0
- XIntuitionName dc.b 'intuition.library',0
- Xtitle dc.b 'BlitterSand -- <esc> to exit',0
- Xfontname dc.b 'topaz.font',0
- Xwindow dc.l 0
- Xrastport dc.l 0
- Xuserport dc.l 0
- Xbitplane1 dc.l 0
- Xbitplane2 dc.l 0
- Xbitplane3 dc.l 0
- Xworkingplane1 dc.l 0
- Xworkingplane2 dc.l 0
- Xworkingplane3 dc.l 0
- Xstorage1 dc.l 0
- Xstorage2 dc.l 0
- Xidentity1 dc.l 0
- Xidentity2 dc.l 0
- Xcontrol dc.w 0
- Xautopause dc.w 0
- Xoldstack dc.l 0
- X
- X; primary updating routine
- Xsand: movea.l GraphicsBase(pc),a6 ; graphics library address in a6
- X jsr _LVOOwnBlitter(a6) ; grab blitter for my use
- X lea _custom,a5
- X move.l bitplane1(pc),d2 ;start of bitplane1
- X move.l bitplane2(pc),d3 ;start of bitplane2
- X move.l bitplane3(pc),d4 ;start of bitplane3
- X move.l workingplane1(pc),d5 ; start of working plane 1
- X move.l workingplane2(pc),d6 ; start of working plane 2
- X move.l workingplane3(pc),d7 ; start of working plane 3
- X ; add left, top, and bottom neighbors to workspace
- X ; work on first bit:
- X jsr _LVOWaitBlit(a6)
- X move.l d5,BLTDPT(a5) ; first workspace plane
- X move.l d4,d0
- X move.l d0,BLTAPT(a5) ; for left neighbor
- X addi.l #40,d0
- X move.l d0,BLTBPT(a5) ; for bottom neighbor
- X subi.l #80,d0
- X move.l d0,BLTCPT(a5) ; for top
- X move.w #0,BLTCON1(a5)
- X move.w #$1f96,BLTCON0(a5) ; odd number of source bits set
- X move.w #modulo,BLTAMOD(a5) ; set up modulos
- X move.w #modulo,BLTBMOD(a5)
- X move.w #modulo,BLTCMOD(a5)
- X move.w #modulo,BLTDMOD(a5)
- X move.w #$ffff,BLTAFWM(a5)
- X move.w #$fffe,BLTALWM(a5) ; mask out last bit of row
- X move.w #bsize,BLTSIZE(a5) ; do it
- X ; second bit
- X jsr _LVOWaitBlit(a6)
- X move.l d6,BLTDPT(a5) ; second plane of workspace
- X move.l d4,d0
- X move.l d0,BLTAPT(a5) ; reset bitplane pointers
- X addi.l #40,d0
- X move.l d0,BLTBPT(a5)
- X subi.l #80,d0
- X move.l d0,BLTCPT(a5)
- X move.w #$1fe8,BLTCON0(a5) ; 2 or more source bits set
- X move.w #bsize,BLTSIZE(a5) ; go to it
- X; add in fourth neighbor, third bit of result
- X jsr _LVOWaitBlit(a6)
- X move.l d4,d0
- X addi.l #enddisp,d0
- X move.l d0,BLTAPT(a5) ; end of lattice
- X move.l d7,d0
- X addi.l #enddisp,d0
- X move.l d0,BLTDPT(a5) ; end of third plane of workspace
- X move.l d5,d0
- X addi.l #enddisp,d0
- X move.l d0,BLTBPT(a5) ; first workspace plane
- X move.l d6,d0
- X addi.l #enddisp,d0 ; second workspace plane
- X move.l d0,BLTCPT(a5)
- X move.w #2,BLTCON1(a5) ; descending mode
- X move.w #$1f80,BLTCON0(a5) ; third bit only if all already set
- X move.w #$7fff,BLTALWM(a5)
- X move.w #bsize,BLTSIZE(a5) ; OK
- X; add in fourth neighbor, second bit of result
- X jsr _LVOWaitBlit(a6)
- X move.l d4,d0
- X addi.l #enddisp,d0
- X move.l d0,BLTAPT(a5)
- X move.l d6,d0
- X addi.l #enddisp,d0
- X move.l d0,BLTDPT(a5)
- X move.l d0,BLTCPT(a5)
- X move.l d5,d0
- X addi.l #enddisp,d0
- X move.l d0,BLTBPT(a5)
- X move.w #$1f6a,BLTCON0(a5) ; second bit only if appropriate
- X move.w #bsize,BLTSIZE(a5) ; here we go again
- X; add in fourth neighbor, first bit of result
- X jsr _LVOWaitBlit(a6)
- X move.l d4,d0
- X addi.l #enddisp,d0
- X move.l d0,BLTAPT(a5)
- X move.l d5,d0
- X addi.l #enddisp,d0
- X move.l d0,BLTDPT(a5)
- X move.l d0,BLTBPT(a5)
- X move.w #$1d3c,BLTCON0(a5) ; second bit from a xor b
- X move.w #bsize,BLTSIZE(a5) ; finish setting up workspace
- X; add it all up
- X jsr _LVOWaitBlit(a6) ; 2w,3w,2b to 3b
- X move.l d4,BLTDPT(a5)
- X move.l d3,BLTAPT(a5)
- X move.l d6,BLTBPT(a5)
- X move.l d7,BLTCPT(a5)
- X move.w #0,BLTCON1(a5) ; reset for ascending mode
- X move.w #$0fea,BLTCON0(a5)
- X move.w #$ffff,BLTALWM(a5) ; fix last word mask
- X move.w #bsize,BLTSIZE(a5)
- X jsr _LVOWaitBlit(a6) ; 2w,2b to 2b
- X move.l d3,BLTDPT(a5)
- X move.l d3,BLTAPT(a5)
- X move.l d6,BLTBPT(a5)
- X move.w #$0d3c,BLTCON0(a5)
- X move.w #bsize,BLTSIZE(a5)
- X jsr _LVOWaitBlit(a6) ; 1w,1b,2b to 3w for carry
- X move.l d7,BLTDPT(a5)
- X move.l d2,BLTAPT(a5)
- X move.l d3,BLTBPT(a5)
- X move.l d5,BLTCPT(a5)
- X move.w #$0f80,BLTCON0(a5)
- X move.w #bsize,BLTSIZE(a5)
- X jsr _LVOWaitBlit(a6) ; 1w, 1b to 2b
- X move.l d3,BLTDPT(a5)
- X move.l d2,BLTAPT(a5)
- X move.l d5,BLTBPT(a5)
- X move.l d3,BLTCPT(a5)
- X move.w #$0f6a,BLTCON0(a5)
- X move.w #bsize,BLTSIZE(a5)
- X jsr _LVOWaitBlit(a6) ; final carry
- X move.l d4,BLTDPT(a5)
- X move.l d4,BLTAPT(a5)
- X move.l d7,BLTBPT(a5)
- X move.w #$0dfc,BLTCON0(a5)
- X move.w #bsize,BLTSIZE(a5)
- X jsr _LVOWaitBlit(a6) ; 1w, 1b to 1b
- X move.w DMACONR(a5),control ; save control register for later
- X move.l d2,BLTDPT(a5)
- X move.l d2,BLTAPT(a5)
- X move.l d5,BLTBPT(a5)
- X move.w #$0d3c,BLTCON0(a5)
- X move.w #bsize,BLTSIZE(a5)
- X jsr _LVODisownBlitter(a6) ; I'm done for now
- X rts
- X
- X; double main lattice
- Xdouble: movea.l GraphicsBase(pc),a6 ; graphics library address in a6
- X jsr _LVOOwnBlitter(a6)
- X lea _custom,a5
- X move.l bitplane1(pc),d2 ;start of bitplane1
- X move.l bitplane2(pc),d3 ;start of bitplane2
- X move.l bitplane3(pc),d4 ;start of bitplane3
- X; shift up all bitplanes
- X jsr _LVOWaitBlit(a6)
- X move.l d4,BLTDPT(a5) ; copy to plane 3
- X move.l d3,BLTAPT(a5) ; from plane 2
- X move.w #0,BLTCON1(a5)
- X move.w #$09f0,BLTCON0(a5)
- X move.w #modulo,BLTAMOD(a5)
- X move.w #modulo,BLTBMOD(a5)
- X move.w #modulo,BLTCMOD(a5)
- X move.w #modulo,BLTDMOD(a5)
- X move.w #$ffff,BLTAFWM(a5)
- X move.w #$ffff,BLTALWM(a5)
- X move.w #bsize,BLTSIZE(a5)
- X jsr _LVOWaitBlit(a6)
- X move.l d3,BLTDPT(a5) ; copy to plane 2
- X move.l d2,BLTAPT(a5) ; from plane 1
- X move.w #$09f0,BLTCON0(a5)
- X move.w #bsize,BLTSIZE(a5)
- X jsr _LVOWaitBlit(a6)
- X move.l d2,BLTDPT(a5) ; clear plane 1
- X move.w #$0100,BLTCON0(a5)
- X move.w #bsize,BLTSIZE(a5)
- X jsr _LVODisownBlitter(a6) ; give it back
- X rts
- X
- Xcompare2 ; compare two planes, pointed to by (a0) and (a1)
- X movea.l GraphicsBase(pc),a6 ; graphics library address in a6
- X lea _custom,a5
- X move.l (a0)+,d2 ;start of bitplane1
- X move.l (a0),d3 ;start of bitplane2
- X move.l (a1)+,d4 ;start of comparison bitplane1
- X move.l (a1),d5 ;start of comparison bitplane2
- X jsr _LVOOwnBlitter(a6) ; get blitter
- X jsr _LVOWaitBlit(a6)
- X move.l d2,BLTAPT(a5) ; plane 1
- X move.l d4,BLTBPT(a5) ; compare 1
- X move.w #0,BLTCON1(a5)
- X move.w #$0c3c,BLTCON0(a5)
- X move.w #modulo,BLTAMOD(a5)
- X move.w #modulo,BLTBMOD(a5)
- X move.w #$ffff,BLTAFWM(a5)
- X move.w #$ffff,BLTALWM(a5)
- X move.w #bsize,BLTSIZE(a5)
- X jsr _LVOWaitBlit(a6)
- X move.w DMACONR(a5),control ; save control register for later
- X move.l d3,BLTAPT(a5) ; plane 2
- X move.l d5,BLTBPT(a5) ; compare 2
- X move.w #0,BLTCON1(a5)
- X move.w #$0c3c,BLTCON0(a5)
- X move.w #bsize,BLTSIZE(a5)
- X jsr _LVOWaitBlit(a6)
- X move.w DMACONR(a5),d0
- X and.w d0,control ; save control register for later
- X jsr _LVODisownBlitter(a6) ; give it back
- X rts
- X
- Xcopy2 ; copy two planes, pointed to by (a0) and (a1)
- X movea.l GraphicsBase(pc),a6 ; graphics library address in a6
- X lea _custom,a5
- X move.l (a0)+,d2 ;start of bitplane1
- X move.l (a0),d3 ;start of bitplane2
- X move.l (a1)+,d4 ;start of copy bitplane1
- X move.l (a1),d5 ;start of copy bitplane2
- X jsr _LVOOwnBlitter(a6) ; prepare blitter
- X jsr _LVOWaitBlit(a6)
- X move.l d2,BLTAPT(a5) ; plane 1
- X move.l d4,BLTDPT(a5) ; copy 1
- X move.w #0,BLTCON1(a5)
- X move.w #$09f0,BLTCON0(a5) ; straight copy
- X move.w #modulo,BLTAMOD(a5)
- X move.w #modulo,BLTDMOD(a5)
- X move.w #$ffff,BLTAFWM(a5)
- X move.w #$ffff,BLTALWM(a5)
- X move.w #bsize,BLTSIZE(a5)
- X jsr _LVOWaitBlit(a6)
- X move.l d3,BLTAPT(a5) ; plane 2
- X move.l d5,BLTDPT(a5) ; copy 2
- X move.w #0,BLTCON1(a5)
- X move.w #$09f0,BLTCON0(a5)
- X move.w #bsize,BLTSIZE(a5)
- X jsr _LVODisownBlitter(a6) ; give it back
- X rts
- X
- Xset1: ; set one plane to unity, pointed to by (a0)
- X movea.l GraphicsBase(pc),a6 ; graphics library address in a6
- X lea _custom,a5
- X move.l (a0),d2 ;start of plane
- X jsr _LVOOwnBlitter(a6) ; get blitter
- X jsr _LVOWaitBlit(a6)
- X move.l d2,BLTDPT(a5) ; plane 1
- X move.w #0,BLTCON1(a5)
- X move.w #$01ff,BLTCON0(a5) ; straight set
- X move.w #modulo,BLTDMOD(a5)
- X move.w #bsize,BLTSIZE(a5)
- X jsr _LVODisownBlitter(a6) ; give it back
- X rts
- X
- X; subtract storage1 from nonzero lattice sites
- Xsubtract1: movea.l GraphicsBase(pc),a6 ; graphics library address in a6
- X jsr _LVOOwnBlitter(a6)
- X lea _custom,a5
- X move.l bitplane1(pc),d2 ;start of bitplane1
- X move.l bitplane2(pc),d3 ;start of bitplane2
- X move.l workingplane1(pc),d5 ; start of working plane 1
- X move.l workingplane2(pc),d6 ; start of working plane 2
- X move.l storage1(pc),d7
- X jsr _LVOWaitBlit(a6)
- X move.l d5,BLTDPT(a5) ; new first plane to working plane
- X move.l d2,BLTAPT(a5) ; old first plane
- X move.l d3,BLTBPT(a5) ; old second plane
- X move.l d7,BLTCPT(a5) ; subtracting plane
- X move.w #0,BLTCON1(a5)
- X move.w #$0f58,BLTCON0(a5)
- X move.w #modulo,BLTAMOD(a5)
- X move.w #modulo,BLTBMOD(a5)
- X move.w #modulo,BLTCMOD(a5)
- X move.w #modulo,BLTDMOD(a5)
- X move.w #$ffff,BLTAFWM(a5)
- X move.w #$ffff,BLTALWM(a5)
- X move.w #bsize,BLTSIZE(a5)
- X jsr _LVOWaitBlit(a6)
- X move.l d6,BLTDPT(a5) ; new second plane to working plane
- X move.l d2,BLTAPT(a5) ; old first plane
- X move.l d3,BLTBPT(a5) ; old second plane
- X move.l d7,BLTCPT(a5) ; subtracting plane
- X move.w #0,BLTCON1(a5)
- X move.w #$0fc4,BLTCON0(a5)
- X move.w #bsize,BLTSIZE(a5)
- X jsr _LVOWaitBlit(a6)
- X move.l d7,BLTDPT(a5) ; new subtracting plane to storage
- X move.l d2,BLTAPT(a5) ; old first plane
- X move.l d3,BLTBPT(a5) ; old second plane
- X move.l d7,BLTCPT(a5) ; subtracting plane
- X move.w #0,BLTCON1(a5)
- X move.w #$0f02,BLTCON0(a5)
- X move.w #bsize,BLTSIZE(a5)
- X jsr _LVOWaitBlit(a6)
- X move.w DMACONR(a5),control ; save control register for later
- X move.l d5,BLTAPT(a5) ; new plane 1
- X move.l d2,BLTDPT(a5) ; copy back
- X move.w #0,BLTCON1(a5)
- X move.w #$09f0,BLTCON0(a5) ; straight copy
- X move.w #bsize,BLTSIZE(a5)
- X jsr _LVOWaitBlit(a6)
- X move.l d6,BLTAPT(a5) ; new plane 2
- X move.l d3,BLTDPT(a5) ; copy back
- X move.w #0,BLTCON1(a5)
- X move.w #$09f0,BLTCON0(a5)
- X move.w #bsize,BLTSIZE(a5)
- X jsr _LVODisownBlitter(a6) ; give it back
- X rts
- X
- X; add two lattices, source pointed at by (a0) and dest by (a1)
- Xaddit: movea.l GraphicsBase(pc),a6 ; graphics library address in a6
- X lea _custom,a5
- X move.l (a1)+,d2 ;start of bitplane1
- X move.l (a1)+,d3 ;start of bitplane2
- X move.l (a1),d4 ;start of bitplane3
- X move.l (a0)+,d5 ;start of adding plane1
- X move.l (a0),d6 ;start of adding plane2
- X jsr _LVOOwnBlitter(a6) ; prepare to add identity to lattice
- X move.l workingplane3(pc),d7 ; for carry
- X jsr _LVOWaitBlit(a6)
- X move.l d7,BLTDPT(a5) ; carry
- X move.l d2,BLTAPT(a5) ; old first plane
- X move.l d5,BLTBPT(a5) ; identity1
- X move.w #0,BLTCON1(a5)
- X move.w #$0dc0,BLTCON0(a5)
- X move.w #modulo,BLTAMOD(a5)
- X move.w #modulo,BLTBMOD(a5)
- X move.w #modulo,BLTCMOD(a5)
- X move.w #modulo,BLTDMOD(a5)
- X move.w #$ffff,BLTAFWM(a5)
- X move.w #$ffff,BLTALWM(a5)
- X move.w #bsize,BLTSIZE(a5)
- X jsr _LVOWaitBlit(a6)
- X move.l d2,BLTDPT(a5) ; new first plane (assume old=0)
- X move.l d2,BLTAPT(a5) ; old first plane
- X move.l d5,BLTBPT(a5) ; identity1
- X move.w #0,BLTCON1(a5)
- X move.w #$0d3c,BLTCON0(a5)
- X move.w #bsize,BLTSIZE(a5)
- X jsr _LVOWaitBlit(a6)
- X move.l d4,BLTDPT(a5) ; new third bit
- X move.l d3,BLTAPT(a5) ; old second plane
- X move.l d6,BLTBPT(a5) ; identity2
- X move.l d7,BLTCPT(a5) ; old carry
- X move.w #0,BLTCON1(a5)
- X move.w #$0fe8,BLTCON0(a5)
- X move.w #bsize,BLTSIZE(a5)
- X jsr _LVOWaitBlit(a6)
- X move.l d3,BLTDPT(a5) ; new second bit
- X move.l d3,BLTAPT(a5) ; old second plane
- X move.l d6,BLTBPT(a5) ; identity2
- X move.l d7,BLTCPT(a5) ; old carry
- X move.w #0,BLTCON1(a5)
- X move.w #$0f96,BLTCON0(a5)
- X move.w #bsize,BLTSIZE(a5)
- X jsr _LVODisownBlitter(a6) ; give it back
- X rts
- X
- Xcredits: ; display introductory comments
- X moveq.l #30,d2 ; length of lines
- X moveq.l #15,d3 ; number of lines
- X moveq.l #25,d4 ; starting row
- X movea.l GraphicsBase(pc),a6 ; graphics library address in a6
- X lea.l mytext(pc),a3 ; start of text information
- X movea.l rastport(pc),a1
- X moveq.w #7,d0
- X jsr _LVOSetBPen(a6) ; set background pen color
- X movea.l rastport(pc),a1
- X moveq.w #JAM2,d0
- X jsr _LVOSetDrMd(a6) ; set drawing mode
- X bra startprint
- Xmyprint: movea.l rastport(pc),a1 ; rastport
- X move.l d4,d1 ; starting row
- X moveq.l #40,d0 ; starting column
- X jsr _LVOMove(a6) ; locate pen
- X movea.l rastport(pc),a1 ; rastport
- X move.b (a3)+,d0 ; get color
- X andi.l #7,d0 ; make sure color valid
- X jsr _LVOSetAPen(a6) ; set color
- X movea.l rastport(pc),a1 ; rastport
- X movea.l a3,a0 ; text location
- X move.l d2,d0 ; length of line
- X jsr _LVOText(a6) ; print line
- X adda.l d2,a3 ; next line
- X addi.l #8,d4 ; next row
- Xstartprint: dbf d3,myprint
- X bsr waitformessage ; wait for key press
- X movea.l GraphicsBase(pc),a6 ; graphics library address in a6
- X movea.l rastport(pc),a1
- X moveq.l #0,d0
- X jsr _LVOSetRast(a6) ; clear screen
- X rts
- Xmytext: ; initial number represents color
- X dc.b 2,' '
- X dc.b 2,' BlitterSand '
- X dc.b 2,' '
- X dc.b 6,' by '
- X dc.b 2,' '
- X dc.b 5,' Michael Creutz '
- X dc.b 6,' creutz@bnlux0.bnl.gov '
- X dc.b 5,' '
- X dc.b 5,'<esc>, q exit '
- X dc.b 5,' p pause '
- X dc.b 5,' d double modulo 8 '
- X dc.b 5,' a pause after relax '
- X dc.b 1,' '
- X dc.b 1,' Press any key to start '
- X dc.b 2,' '
- X end
- END_OF_FILE
- if test 29043 -ne `wc -c <'BlitterSand.asm'`; then
- echo shar: \"'BlitterSand.asm'\" unpacked with wrong size!
- fi
- chmod +x 'BlitterSand.asm'
- # end of 'BlitterSand.asm'
- fi
- if test -f 'BlitterSand.uu' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'BlitterSand.uu'\"
- else
- echo shar: Extracting \"'BlitterSand.uu'\" \(4689 characters\)
- sed "s/^X//" >'BlitterSand.uu' <<'END_OF_FILE'
- Xbegin 700 BlitterSand
- XM```#\P`````````!``````````````,5```#Z0```Q5(YS\^+'@`!$*Y```#E
- XMPI/)3J[^VBA`2JP`K&8``!1![`!<3J[^@$ZN_HPCP````\)#^@.<<`!.KOW8$
- XM(\````/&2H!G,D/Z`YEP`$ZN_=@CP````\I*@&<280``-B)Y```#RBQX``1.1
- XMKOYB(GD```/&3J[^8G``2KD```/"9PQ.KO]\(GH#/DZN_H9,WWS\3G4CSP``E
- XM!%)T!T7Z`YA@&"`\```=8"(\``$``DZN_SI*@&<``@`DP%'*_^8L>@,.0?H"=
- XMRDZN_SHCP````WAG``'D0?H"B$ZN_S0CP```!!IG``'*($`CZ`!6```$(B!H_
- XM`#(CR```!!X@:``$(^@`"```!"8CZ``,```$*B/H`!````0N!KD```&Z```$8
- XM)@:Y```!N@``!"H&N0```;H```0N+'H"E"!Z`D+1_````"Q#^@)R<`A.KO]`Q
- XM80`(R")Z`M!P`4ZN_JHB>@+&<`!.KOZ>(GH"O#`\`!`R/``+3J[_$"!Z`JPPR
- XM/`$O,CP`"TZN_PH@>@*<,#P!+S(\`,9.KO\*('H"C#`\`!`R/`#&3J[_"B!ZN
- XM`GPP/``0,CP`"TZN_PHB>@)L<`).KOZJ(GH"8C`\`!`R/``+3J[^O")Z`E(PC
- XM/`$O,CP`"TZN_KPB>@)",#P!+S(\`,9.KOZ\(GH",C`\`!`R/`#&3J[^O&$`8
- XM`-Q!^@(^0_H"(F$`!08(.@`%`D!F$D'Z`A)#^@(F80`%>&$`!&!@UD'Z`@!#R
- XM^@(<80`%9D'Z`@QA``7.8!AA``(:"#H`!0(,9PQ!^@'^0_H!VF$`!NQA``7F/
- XM"#H`!0'T9@9A``"D8-9A``!R0?H!O$/Z`=!A``4B80`$"F$``%Y!^@'`0_H!L
- XMI&$`!K9A``!.0?H!N$/Z`91A``:F80``/F#N('H!>BQZ`29.KO^X('H`S$ZNG
- XM_[XL>``$=`=%^@%X8!`@/```'6`B6B()9PA.KO\N4<K_[BYZ`7Y.=6$``7P(X
- XM.@`%`6YF!F$``!Y@[DIY```$4&<$80``!$YU+'@`!"!Z`21.KOZ`+'@`!"!ZT
- XM`1A.KOZ,2H!F`DYU(D`D*0`4-BD`&$ZN_H8,0P`;;P#_=`Q#`'%G`/]L#$,`[
- XM<&8(('H`YDZN_H`,0P!D9@1A``,V#$,`868&1GD```103G4``````4``R```*
- XM`"``````&````````````````_$````````````````!0`#(``\``````4``%
- XMR``#!08````/```#J@```_$`````````````!`X`"```#_\```\``/`/\``/[
- XM#P\`_P```````````````&=R87!H:6-S+FQI8G)A<GD`:6YT=6ET:6]N+FQIW
- XM8G)A<GD`0FQI='1E<E-A;F0@+2T@/&5S8SX@=&\@97AI=`!T;W!A>BYF;VYT[
- XM`````````````````````````````````````````````````````````````
- XM```````````````````````L>O]N3J[^.$OY`-_P`"0Z_\`F.O_`*#K_P"HZ9
- XM_\`L.O_`+CK_P$ZN_QPK10!4(`0K0`!0!H`````H*T``3`2`````4"M``$@[L
- XM?````$([?!^6`$`[?``$`&0[?``$`&([?``$`&`[?``$`&8[?/__`$0[?/_^/
- XM`$8[?"\2`%A.KO\<*T8`5"`$*T``4`:`````*"M``$P$@````%`K0`!(.WP?3
- XMZ`!`.WPO$@!83J[_'"`$!H```!U:*T``4"`'!H```!U:*T``5"`%!H```!U:P
- XM*T``3"`&!H```!U:*T``2#M\``(`0CM\'X``0#M\?_\`1CM\+Q(`6$ZN_QP@@
- XM!`:````=6BM``%`@!@:````=6BM``%0K0`!((`4&@```'5HK0`!,.WP?:@!`J
- XM.WPO$@!83J[_'"`$!H```!U:*T``4"`%!H```!U:*T``5"M``$P[?!T\`$`[F
- XM?"\2`%A.KO\<*T0`5"M#`%`K1@!,*T<`2#M\````0CM\#^H`0#M\__\`1CM\_
- XM+Q(`6$ZN_QPK0P!4*T,`4"M&`$P[?`T\`$`[?"\2`%A.KO\<*T<`5"M"`%`K"
- XM0P!,*T4`2#M\#X``0#M\+Q(`6$ZN_QPK0P!4*T(`4"M%`$PK0P!(.WP/:@!`5
- XM.WPO$@!83J[_'"M$`%0K1`!0*T<`3#M\#?P`0#M\+Q(`6$ZN_QPS[0`"```$T
- XM3BM"`%0K0@!0*T4`3#M\#3P`0#M\+Q(`6$ZN_C).=2QZ_41.KOXX2_D`W_``S
- XM)#K]EB8Z_98H.OV63J[_'"M$`%0K0P!0.WP```!".WP)\`!`.WP`!`!D.WP`P
- XM!`!B.WP`!`!@.WP`!`!F.WS__P!$.WS__P!&.WPO$@!83J[_'"M#`%0K0@!0\
- XM.WP)\`!`.WPO$@!83J[_'"M"`%0[?`$``$`[?"\2`%A.KOXR3G4L>ORV2_D`K
- XMW_``)!@F$"@9*A%.KOXX3J[_'"M"`%`K1`!,.WP```!".WP,/`!`.WP`!`!D5
- XM.WP`!`!B.WS__P!$.WS__P!&.WPO$@!83J[_'#/M``(```1.*T,`4"M%`$P[A
- XM?````$([?`P\`$`[?"\2`%A.KO\<,"T``L%Y```$3DZN_C).=2QZ_#!+^0#?S
- XM\``D&"80*!DJ$4ZN_CA.KO\<*T(`4"M$`%0[?````$([?`GP`$`[?``$`&0[J
- XM?``$`&8[?/__`$0[?/__`$8[?"\2`%A.KO\<*T,`4"M%`%0[?````$([?`GPL
- XM`$`[?"\2`%A.KOXR3G4L>OO`2_D`W_``)!!.KOXX3J[_'"M"`%0[?````$([E
- XM?`'_`$`[?``$`&8[?"\2`%A.KOXR3G4L>ON*3J[^.$OY`-_P`"0Z^]PF.OO<X
- XM*CK[X"PZ^^`N.OOD3J[_'"M%`%0K0@!0*T,`3"M'`$@[?````$([?`]8`$`[E
- XM?``$`&0[?``$`&([?``$`&`[?``$`&8[?/__`$0[?/__`$8[?"\2`%A.KO\<8
- XM*T8`5"M"`%`K0P!,*T<`2#M\````0CM\#\0`0#M\+Q(`6$ZN_QPK1P!4*T(`3
- XM4"M#`$PK1P!(.WP```!".WP/`@!`.WPO$@!83J[_'#/M``(```1.*T4`4"M"-
- XM`%0[?````$([?`GP`$`[?"\2`%A.KO\<*T8`4"M#`%0[?````$([?`GP`$`[+
- XM?"\2`%A.KOXR3G4L>OJ(2_D`W_``)!DF&2@1*A@L$$ZN_C@N.OKD3J[_'"M'S
- XM`%0K0@!0*T4`3#M\````0CM\#<``0#M\``0`9#M\``0`8CM\``0`8#M\``0`<
- XM9CM\__\`1#M\__\`1CM\+Q(`6$ZN_QPK0@!4*T(`4"M%`$P[?````$([?`T\T
- XM`$`[?"\2`%A.KO\<*T0`5"M#`%`K1@!,*T<`2#M\````0CM\#^@`0#M\+Q(`^
- XM6$ZN_QPK0P!4*T,`4"M&`$PK1P!(.WP```!".WP/E@!`.WPO$@!83J[^,DYUZ
- XM=!YV#W@9+'KYK$?Z`&(B>OG\<`=.KOZD(GKY\G`!3J[^GF```#(B>OGD(@1PM
- XM*$ZN_Q`B>OG8$!L"@`````=.KOZJ(GKYR"!+(`).KO_$U\(&A`````A1R__.U
- XM80#XBBQZ^50B>OFH<`!.KO\63G4"("`@("`@("`@("`@("`@("`@("`@("`@9
- XM("`@("`@`B`@("`@("`@($)L:71T97)386YD("`@("`@("`@(`(@("`@("`@@
- XM("`@("`@("`@("`@("`@("`@("`@("`&("`@("`@("`@("`@(&)Y("`@("`@A
- XM("`@("`@("`@`B`@("`@("`@("`@("`@("`@("`@("`@("`@("`@(`4@("`@G
- XM("`@($UI8VAA96P@0W)E=71Z("`@("`@("`&("`@("!C<F5U='I`8FYL=7@PL
- XM+F)N;"YG;W8@("`@!2`@("`@("`@("`@("`@("`@("`@("`@("`@("`@(`4\J
- XM97-C/BP@<2`@97AI="`@("`@("`@("`@("`@("`%("!P("`@("`@('!A=7-EC
- XM("`@("`@("`@("`@("`@!2`@9"`@("`@("!D;W5B;&4@;6]D=6QO(#@@("`@L
- XM(`4@(&$@("`@("`@<&%U<V4@869T97(@<F5L87@@("`!("`@("`@("`@("`@3
- XM("`@("`@("`@("`@("`@("`@`2`@("!0<F5S<R!A;GD@:V5Y('1O('-T87)TP
- XM("`@(`(@("`@("`@("`@("`@("`@("`@("`@("`@("`@("``3G$```/L````P
- XM'``````````*````+````#P```!0````7@```&P```!X````D@```,@```#:4
- XM````Z````/(```#^```!!@```0X```$8```!(@```2P```+L```#5````W0`3
- XC``.:```#G@```ZH```9>```'8@``!XH```CZ`````````_+LL
- X``
- Xend
- Xsize 3320
- END_OF_FILE
- if test 4689 -ne `wc -c <'BlitterSand.uu'`; then
- echo shar: \"'BlitterSand.uu'\" unpacked with wrong size!
- fi
- # end of 'BlitterSand.uu'
- fi
- echo shar: End of archive 1 \(of 1\).
- cp /dev/null ark1isdone
- MISSING=""
- for I in 1 ; do
- if test ! -f ark${I}isdone ; then
- MISSING="${MISSING} ${I}"
- fi
- done
- if test "${MISSING}" = "" ; then
- echo You have the archive.
- rm -f ark[1-9]isdone
- else
- echo You still need to unpack the following archives:
- echo " " ${MISSING}
- fi
- ## End of shell archive.
- exit 0
- --
- Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
- Mail comments to the moderator at <amiga-request@uunet.uu.net>.
- Post requests for sources, and general discussion to comp.sys.amiga.
-